layui.define(['allHeight', 'configure', 'configureCom', 'matchType', 'sessionFun'], function (exports) {
    var allHeight = layui.allHeight;
    var configure = layui.configure;
    var configureCom = layui.configureCom;
    var matchType = layui.matchType;
    var sessionFun = layui.sessionFun;
    var uploadConfig = sessionFun.get(configure.SESSION_UPLOAD_CONFIG)
    //var listData = sessionFun.get(configure.SESSION_PROJECT_WAIT_LIST_DATA);//获取文件树选中文件对象
    //var drawingTreeData = sessionFun.get(configure.SESSION_FILE_TREE_DATA);//获取文件树选中文件对象
    //var tuzhiData = sessionFun.get(configure.SESSION_CKTZ_INFO_DATA);//图纸对象
    var $wrap = $('#uploader'),

        // 图片容器
        $queue = $('<ul class="filelist"></ul>')
            .appendTo($wrap.find('.queueList')),

        // 状态栏，包括进度和控制按钮
        $statusBar = $wrap.find('.statusBar'),

        // 文件总体选择信息。
        $info = $statusBar.find('.info'),

        // 上传按钮
        $upload = $wrap.find('.uploadBtn'),

        // 没选择文件之前的内容。
        $placeHolder = $wrap.find('.placeholder'),

        $progress = $statusBar.find('.progress').hide(),

        // 添加的文件数量
        fileCount = 0,

        // 添加的文件总大小
        fileSize = 0,

        // 优化retina, 在retina下这个值是2
        ratio = window.devicePixelRatio || 1,

        // 缩略图大小
        thumbnailWidth = 110 * ratio,
        thumbnailHeight = 110 * ratio,

        // 可能有pedding, ready, uploading, confirm, done.
        state = 'pedding',

        // 所有文件的进度信息，key为file id
        percentages = {},
        // 判断浏览器是否支持图片的base64
        isSupportBase64 = (function () {
            var data = new Image();
            var support = true;
            data.onload = data.onerror = function () {
                if (this.width !== 1 || this.height !== 1) {
                    support = false;
                }
            };
            data.src = '';
            return support;
        })(),

        // 检测是否已经安装flash，检测flash的版本
        flashVersion = (function () {
            var version;

            try {
                version = navigator.plugins['Shockwave Flash'];
                version = version.description;
            } catch (ex) {
                try {
                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
                        .GetVariable('$version');
                } catch (ex2) {
                    version = '0.0';
                }
            }
            version = version.match(/\d+/g);
            return parseFloat(version[0] + '.' + version[1], 10);
        })(),

        supportTransition = (function () {
            var s = document.createElement('p').style,
                r = 'transition' in s ||
                    'WebkitTransition' in s ||
                    'MozTransition' in s ||
                    'msTransition' in s ||
                    'OTransition' in s;
            s = null;
            return r;
        })(),

        // WebUploader实例
        uploader;


    //监听分块上传过程中的三个时间点
    WebUploader.Uploader.register({
        'after-send-file': 'afterSendFile'
    }, {
        //时间点3：所有分块上传成功后调用此函数
        afterSendFile: function (res, data) {
            if (data.msg) {
                // 重复上传
                if (data.code != 0) {
                    top.layer.msg(data.msg.trim());
                    $('#' + res.id).remove();
                    return false;
                }
            }
            if (res.size > configure.UPLOAD_LARGE_SISE) {
                top.layer.msg('保存成功');
                //如果分块上传成功，则通知后台合并分块
                /*  configureCom.postDataAjax(configure.DRWAING_MERGE_HTTP, fileData).then(function (res) {
                      top.layer.msg('保存成功');
                      // window.parWin.loadOver();
                  }, function (err) {
                      top.layer.msg('上传失败');
                  });*/
            } else {
                top.layer.msg('保存成功');
            }
        }
    });
    //var fileData = {};
    // if (tuzhiData) {//图纸对象如果存在，则为更新图纸
    //     fileData = {
    //         dirId: drawingTreeData.id,
    //         decId: listData.decId,
    //         path: drawingTreeData.path, //路径
    //         specialtyId: drawingTreeData.specialtyId, //专业code
    //         drawingId: tuzhiData.id
    //     };
    // } else {//图纸对象不存在，则为上传图纸
    //     fileData = {
    //         dirId: drawingTreeData.id,
    //         decId: listData.decId,
    //         path: drawingTreeData.path, //路径
    //         specialtyId: drawingTreeData.specialtyId //专业code
    //     };
    // }
    // 实例化
    console.log(uploadConfig.accept? uploadConfig.accept: accept);
    uploader = WebUploader.create({
        pick: {
            id: '#filePicker',
            label: '点击选择文件',
            multiple: multiple
        },
        formData: uploadConfig.formData,//fileData,
        dnd: '#dndArea',
        paste: '#uploader',
        swf: configure.UPLOAD_FLASH_URL,
        chunked: false,//分块
        threads: 1,              //上传并发数。允许同时最大上传进程数。
        method: 'post',
        server: uploadConfig.url?uploadConfig.url:configure.UPLOAD_HTTP,
        accept: uploadConfig.accept? uploadConfig.accept: accept,
        // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候，把图片打开。
        disableGlobalDnd: true,
        fileNumLimit: fileNumLimit,  //文件数量
        fileSizeLimit: fileSizeLimit,        // 文件总大小
        fileSingleSizeLimit: fileSingleSizeLimit    //单个文件上传大小
    });
    //修改请求头，添加token
    uploader.on('uploadBeforeSend', function (obj, data, headers) {
        headers.token = configureCom.getToken();
        // obj.transport.options.server = data.size > configure.UPLOAD_LARGE_SISE ? configure.SIGN_LARGE_UPLOAD : ajaxUrl;
    });

    // 拖拽时不接受 js, txt 文件。
    uploader.on('dndAccept', function (items) {
        var denied = false,
            len = items.length,
            i = 0,
            // 修改js类型
            unAllowed = 'text/plain;application/javascript';

        for (; i < len; i++) {
            // 如果在列表里面
            if (unAllowed.indexOf(items[i].type)) {
                denied = true;
                break;
            }
        }

        return !denied;
    });

    // 文件上传成功，给item添加成功class, 用样式标记上传成功。
    uploader.on('uploadSuccess', function (file, res) {
        var item = $('#' + file.id);
        if (res.code != 0) {
            top.layer.alert(res.msg);
            if (item.siblings().length === 0) {
                location.reload(true);
            }
            item.remove();
        }
    });

    // 添加“添加文件”的按钮，
    if (multiple) {
        uploader.addButton({
            id: '#filePicker2',
            label: '继续添加'
        });
    }
    uploader.on('ready', function () {
        window.uploader = uploader;
    });

    // 当有文件添加进来时执行，负责view的创建
    function addFile(file) {
        var $li = $('<li id="' + file.id + '">' + '<p class="title">' + file.name + '</p>' + '<p class="imgWrap"></p>' + '<p class="progress"><span></span></p>' + '</li>');

        var $btns = $('<div class="file-panel">' + '<span class="cancel">删除</span>' + '<span class="rotateRight">向右旋转</span>' + '<span class="rotateLeft">向左旋转</span></div>').appendTo($li);
        var $prgress = $li.find('p.progress span');
        var $wrap = $li.find('p.imgWrap');
        var $info = $('<p class="error"></p>');
        var showError = function (code) {
            switch (code) {
                case 'exceed_size':
                    text = '文件大小超出';
                    break;

                case 'interrupt':
                    text = '上传暂停';
                    break;

                default:
                    text = '上传失败，请重试';
                    break;
            }
            $info.text(text).appendTo($li);
        };

        if (file.getStatus() === 'invalid') {
            showError(file.statusText);
        } else {
            // @todo lazyload
            $wrap.text('预览中');
            uploader.makeThumb(file, function (error, src) {
                var img;

                if (error) {
                    $wrap.text('不能预览');
                    return;
                }

                if (isSupportBase64) {
                    img = $('<img src="' + src + '">');
                    $wrap.empty().append(img);
                } else {
                    $.ajax('../../../../FlexUploadServlet2', {
                        method: 'POST',
                        data: src,
                        dataType: 'json'
                    }).done(function (response) {
                        if (response.result) {
                            img = $('<img src="' + response.result + '">');
                            $wrap.empty().append(img);
                        } else {
                            $wrap.text('预览出错');
                        }
                    });
                }
            }, thumbnailWidth, thumbnailHeight);

            percentages[file.id] = [file.size, 0];
            file.rotation = 0;
        }

        file.on('statuschange', function (cur, prev) {
            if (prev === 'progress') {
                $prgress.hide().width(0);
            } else if (prev === 'queued') {
                $li.off('mouseenter mouseleave');
                $btns.remove();
            }

            // 成功
            if (cur === 'error' || cur === 'invalid') {
                showError(file.statusText);
                percentages[file.id][1] = 1;
            } else if (cur === 'interrupt') {
                showError('interrupt');
            } else if (cur === 'queued') {
                percentages[file.id][1] = 0;
            } else if (cur === 'progress') {
                $info.remove();
                $prgress.css('display', 'block');
            } else if (cur === 'complete') {
                $li.append('<span class="success"></span>');
            }

            $li.removeClass('state-' + prev).addClass('state-' + cur);
        });

        $li.on('mouseenter', function () {
            $btns.stop().animate({height: 30});
        });

        $li.on('mouseleave', function () {
            $btns.stop().animate({height: 0});
        });

        $btns.on('click', 'span', function () {
            var index = $(this).index(),
                deg;

            switch (index) {
                case 0:
                    uploader.removeFile(file);
                    return;

                case 1:
                    file.rotation += 90;
                    break;

                case 2:
                    file.rotation -= 90;
                    break;
            }

            if (supportTransition) {
                deg = 'rotate(' + file.rotation + 'deg)';
                $wrap.css({
                    '-webkit-transform': deg,
                    '-mos-transform': deg,
                    '-o-transform': deg,
                    'transform': deg
                });
            } else {
                $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (((file.rotation / 90) % 4 + 4) % 4) + ')');
                // use jquery animate to rotation
                // $({
                //     rotation: rotation
                // }).animate({
                //     rotation: file.rotation
                // }, {
                //     easing: 'linear',
                //     step: function( now ) {
                //         now = now * Math.PI / 180;

                //         var cos = Math.cos( now ),
                //             sin = Math.sin( now );

                //         $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')");
                //     }
                // });
            }


        });

        $li.appendTo($queue);
    }

    // 负责view的销毁
    function removeFile(file) {
        var $li = $('#' + file.id);

        delete percentages[file.id];
        updateTotalProgress();
        $li.off().find('.file-panel').off().end().remove();
    }

    function updateTotalProgress() {
        var loaded = 0,
            total = 0,
            spans = $progress.children(),
            percent;

        $.each(percentages, function (k, v) {
            total += v[0];
            loaded += v[0] * v[1];
        });

        percent = total ? loaded / total : 0;


        spans.eq(0).text(Math.round(percent * 100) + '%');
        spans.eq(1).css('width', Math.round(percent * 100) + '%');
        updateStatus();
    }

    function updateStatus() {
        var text = '', stats;

        if (state === 'ready') {
            text = '选中' + fileCount + '个图片，共' +
                WebUploader.formatSize(fileSize) + '。';
        } else if (state === 'confirm') {
            stats = uploader.getStats();
            // if (stats.uploadFailNum) {
            //     text = '已成功上传' + stats.successNum + '个文件，' +
            //         stats.uploadFailNum + '个文件上传失败，<a class="retry" href="#">重新上传</a>失败文件或<a class="ignore" href="#">忽略</a>';
            // }

        } else {
            stats = uploader.getStats();
            text = '共' + fileCount + '个文件（' +
                WebUploader.formatSize(fileSize) +
                '），已上传' + stats.successNum + '个';

            if (stats.uploadFailNum) {
                text += '，失败' + stats.uploadFailNum + '个';
            }
        }

        $info.html(text);
    }

    function setState(val) {
        var file, stats;

        if (val === state) {
            return;
        }

        $upload.removeClass('state-' + state);
        $upload.addClass('state-' + val);
        state = val;

        switch (state) {
            case 'pedding':
                $placeHolder.removeClass('element-invisible');
                $queue.hide();
                $statusBar.addClass('element-invisible');
                uploader.refresh();
                break;

            case 'ready':
                $placeHolder.addClass('element-invisible');
                // $('#filePicker2').removeClass('element-invisible');
                $queue.show();
                $statusBar.removeClass('element-invisible');
                allHeight.init('.statusBar', '.queueList');
                uploader.refresh();
                break;

            case 'uploading':
                // $('#filePicker2').addClass('element-invisible');
                $progress.show();
                // $upload.text('暂停上传');
                break;

            case 'paused':
                $progress.show();
                $upload.text('继续上传');
                break;

            case 'confirm':
                $progress.hide();
                // $('#filePicker2').removeClass('element-invisible');
                $upload.text('开始上传');
                break;
        }

        updateStatus();
    }

    uploader.onUploadProgress = function (file, percentage) {
        var $li = $('#' + file.id),
            $percent = $li.find('.progress span');

        $percent.css('width', percentage * 100 + '%');
        percentages[file.id][1] = percentage;
        updateTotalProgress();
    };

    uploader.onFileQueued = function (file) {
        fileCount++;
        fileSize += file.size;
        var drawingType = matchType.init(file.name);
        if (drawingType == 'pdf') {
            if (file.size > 50 * 1024 * 1024) {
                top.layer.msg('文件大小超过限制');
                return false;
            }
        } else if (drawingType == 'dwg') {
            if (file.size > 10 * 1024 * 1024) {
                top.layer.msg('文件大小超过限制');
                return false;
            }
        }
        if (fileCount === 1) {
            $placeHolder.addClass('element-invisible');
            $statusBar.show();
        }
        addFile(file);
        setState('ready');
        updateTotalProgress();
    };

    uploader.onFileDequeued = function (file) {
        fileCount--;
        fileSize -= file.size;

        if (!fileCount) {
            setState('pedding');
        }

        removeFile(file);
        updateTotalProgress();

    };

    uploader.on('all', function (type) {
        var stats;
        switch (type) {
            case 'uploadFinished':
                setState('confirm');
                break;

            case 'startUpload':
                setState('uploading');
                break;

            case 'stopUpload':
                setState('paused');
                break;

        }
    });

    uploader.onError = function (code, file) {
        // alert('504'+code);
        var text = '';
        switch (code) {
            case 'Q_TYPE_DENIED':
                text = '文件类型上传错误';
                break;
            case 'Q_EXCEED_NUM_LIMIT':
                text = '上传数量超过限制';
                break;
            case 'F_DUPLICATE':
                text = '图纸重复';
                break;
            case 'F_EXCEED_SIZE':
                text = '该文件超出大小限制';
                break;
            case 'Q_EXCEED_SIZE_LIMIT':
                text = '上传文件总大小超出限制';
                break;
            default :
                text = '上传发生问题，请联系客服人员';
                break;
        }
        top.layer.msg(text);
    };

    $upload.on('click', function () {
        if ($(this).hasClass('disabled')) {
            return false;
        }

        if (state === 'ready') {
            uploader.upload();
        } else if (state === 'paused') {
            uploader.upload();
        } else if (state === 'uploading') {
            uploader.stop();
        }
    });

    $info.on('click', '.retry', function () {
        uploader.retry();
    });

    $info.on('click', '.ignore', function () {
        alert('todo');
    });

    $upload.addClass('state-' + state);
    updateTotalProgress();
    exports('uploadDrawing', {});
});

function getQueryString(name) {
    var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
    var r = window.location.search.substr(1).match(reg);
    if (r !== null) {
        return unescape(r[2]);
    }
    return null;
}
